import multiprocessing
import os


def copy_file(file_name, old_file_dir, new_file_dir, q):
    """
    文件拷贝
    :param file_name: 要拷贝的文件名
    :param old_file_dir: 原始文件夹
    :param new_file_dir: 新的文件夹
    :return:
    """

    file = open(old_file_dir + "/" + file_name, "rb")
    content = file.read()
    file.close()
    new_file = open(new_file_dir + "/" + file_name, "wb")
    new_file.write(content)
    new_file.close()

    # 往队列添加完成信息
    q.put(file_name)


def main():
    # 拷贝 d://test文件夹
    file_list = os.listdir("D://test")

    old_file_dir = "d://test"
    new_file_dir = "d://test[copy]"

    # 创建新文件夹
    try:
        os.makedirs(new_file_dir)
    except FileExistsError:
        pass

    # 创建队列用户文件拷贝进程与主进程通讯，计算进度
    # 此时使用进程池，需要使用Manager类下的Queue方法创建的队列
    q = multiprocessing.Manager().Queue()

    # 进程池
    po = multiprocessing.Pool(5)
    # 遍历文件开启进程拷贝文件
    for file in file_list:
        # 往进程池添加任务
        po.apply_async(copy_file, (file, old_file_dir, new_file_dir, q))

    po.close()
    # po.join()
    current_finish_num = 0
    all_num = len(file_list)

    while True:
        file_name = q.get()
        current_finish_num += 1

        # 计算进度
        print("\r文件拷贝进度%.2f%%" % (current_finish_num * 100 / all_num), end="")

        if current_finish_num >= all_num:
            # 全部文件拷贝完成
            break


if __name__ == '__main__':
    main()
